﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 回调函数
{
    ///回调函数的作用
    ///1、扩展具体方法
    ///2、方法的隔离和分装
    ///回调函数就是相当于把一个方法当作参数传递给另外一个方法
    ///
    delegate int MyDelegate(int arg);//在类的外面定义了一个委托类型，带一个int 类型的返回值
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 定义的某个复杂的方法，如通信协议
        /// </summary>
        /// <param name="a"></param>
        /// <returns></returns>
        public int Mulitple(int a)
        {
            return a * a;
        }
        public int Add(int b)
        {
            return b + b;
        }
        void myCal(int arg, MyDelegate callback)//定义自己的方法，无返回参数，输入两个参数
        {
            arg *= 2;//先给arg乘以2
            int result = callback(arg);//把传入的参数传递给回调函数callback，通过委托去执行别人的方法
            MessageBox.Show("答案是：" + result);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            myCal(5, Add);//将传入的5先扩大两倍，然后委托callback去执行add方法
            myCal(10, new MyDelegate(Mulitple));//将传入的10先扩大两倍，然后委托callback去执行add方法
        }
        ///使用回调函数，可以把需要用户干预的参数或者需要用户提供给用户的数据通过回调的模式提供给用户
        ///而用户不需要知道整个工作的流程，只需要知道回调函数的说明就可以使用该模块的功能；
    }
}
